package tfc_editor.OnLFileManagement;

import java.util.ArrayList;
import java.util.List;

import tfc_editor.pastrytools.PastryManager;
import tfc_editor.userManagement.UserData;

/**
 * Classe que encapsula un directori online, ja sigui de l'usuari o compartit.
 * @author Ismael Gonzalez Burgos
 *
 */
public class OnLineDirectory 
{
	private static final int FileNameLen = 255;
	private static final int DateLen = 12;
	private static final int HourLen = 10;
	private static final String UserDirectoryHeader = "tfc_editor::UserDirectory::";
	private static final String SharedDirectoryHeader = "tfc_editor::SharedDirectory::";

	private List<OnLineFileEntry> FileList;
	private PastryManager pm;
	private String ValueDirStr;

	/**
	 * Constructor de la classe.
	 * @param PM Punter a la classe PastryManager.
	 */
	public OnLineDirectory(PastryManager PM)
	{
		FileList = new ArrayList<OnLineFileEntry>();
		pm = PM;
	}

	/**
	 * Funcio que carrega un directori d'usuari.
	 * @param ud UserData amb les dades de l'usuari.
	 */
	public void LoadDirectoryFromUser(UserData ud)
	{
		String Key = UserDirectoryHeader + ud.GetLogin();
		DoLoadDirectory(Key);
	}

	/**
	 * Funcio que carrega un directori compartit.
	 */
	public void LoadSharedDirectory()
	{
		String Key = SharedDirectoryHeader;
		DoLoadDirectory(Key);
	}

	/**
	 * Funcio que carrega un directori donada una clau.
	 * @param Key Clau del directori a carregar.
	 */
	public void DoLoadDirectory(String Key)
	{
		ValueDirStr = pm.GetKeyStringString(Key);
		if (ValueDirStr!=null)
		{
			boolean Exit = false;
			int Begin = 0;

			while (!Exit)
			{
				// Cada registre ocupa el nom del fitxer, mes la data de creacio, mes la data de modificacio.
				if (Begin + FileNameLen + DateLen + HourLen <= ValueDirStr.length())
				{
					String Name = ValueDirStr.substring(Begin,Begin + FileNameLen);
					Begin += FileNameLen;
					String DateCreated = ValueDirStr.substring(Begin,Begin + DateLen);
					Begin += DateLen;
					String HourCreated = ValueDirStr.substring(Begin, Begin + HourLen);
					Begin += HourLen;
					String NameTemp = Name.trim();
					OnLineFileEntry olfe = new OnLineFileEntry(NameTemp,DateCreated,HourCreated);
					AddFileToDirectory(olfe);
				}
				else
					Exit = true;
			}
		}
		else
		{
			// No hi ha cap fitxer.
		}
	}

	/**
	 * Funcio que retorna el numero de fitxers que te el directori online.
	 * @return Numero de fitxers.
	 */
	public int GetNumFiles()
	{
		return FileList.size();
	}
	
	/**
	 * Funcio que retorna l'entrada del directori online amb el fitxer d'un determinat index.
	 * @param Index Index del fitxer que volem.
	 * @return OnLineFileEntry que conte l'entrada del directori que volem o be null si no l'hem trobat.
	 */
	public OnLineFileEntry GetFileEntryFromIndex(int Index)
	{
		if (Index >= 0)
		{
			if (FileList.size() > Index)
			{
				return FileList.get(Index);
			}
			else
				return null;
		}
		else
			return null;
	}

	public boolean FileExists(String File)
	{
		for (int i=0;i<FileList.size();i++)
		{
			if (FileList.get(i).GetName().equals(File))
				return true;
		}
		
		return false;
	}
	
	public void AddFileToDirectory(OnLineFileEntry File)
	{
		FileList.add(File);
	}

	public String GetCompleteFileNameWithSpaces(String FileName)
	{
		String Ret = FileName;
		while (Ret.length() < FileNameLen)
		{
			Ret += " ";
		}
		
		return Ret;
	}

	public void SaveDirectory(UserData ud)
	{
		String Key = UserDirectoryHeader + ud.GetLogin();
		DoSaveDirectory(Key);
	}
	
	public void SaveDirectoryShared()
	{
		String Key = SharedDirectoryHeader;
		DoSaveDirectory(Key);
	}

	public void DoSaveDirectory(String Key)
	{
		String Data = "";
		for (int i=0;i<FileList.size();i++)
		{
			OnLineFileEntry ofe = FileList.get(i);
			String FileTemp = GetCompleteFileNameWithSpaces(ofe.GetName());
			Data += FileTemp;
			Data += ofe.GetDateCreated();
			Data += ofe.GetHourCreated();
		}
		pm.AddKeyStringString(Key,Data);		
	}
}
